package com.sweet.jpa.repository;

import com.sweet.jpa.domain.Sort;
import com.sweet.page.Page;
import com.sweet.page.Pageable;
import org.springframework.data.repository.NoRepositoryBean;

import java.io.Serializable;
import java.util.List;

/**
 * 基于实体操作的持久层
 *
 * @param <T>  实体
 * @param <ID> 主键
 */
@NoRepositoryBean
public interface EntityRepository<T, ID extends Serializable> {
    /**
     * 添加对象
     *
     * @param entity 实体
     * @return
     */
    T insert(T entity);

    /**
     * 批量添加对象
     *
     * @param entities 实体列表
     * @return
     */
    List<T> insertAll(Iterable<T> entities);

    /**
     * 更新对象
     *
     * @param entity 实体
     */
    T update(T entity);

    /**
     * 批量更新对象
     *
     * @param entities 实体列表
     */
    List<T> updateAll(Iterable<T> entities);

    /**
     * 根据主键id删除
     *
     * @param id 主键ID
     */
    void removeById(ID id);

    /**
     * 删除实体
     *
     * @param entity 实体
     */
    void remove(T entity);

    /**
     * 批量删除实体
     *
     * @param entities 实体列表
     */
    void removeAll(Iterable<T> entities);

    /**
     * 根据主键批量删除
     *
     * @param ids 主键列表
     */
    void removeAllById(Iterable<ID> ids);

    /**
     * 清空所有
     */
    int clear();

    /**
     * 获取所有实体总数
     *
     * @return
     */
    int getCount();

    /**
     * 根据主键获取实体
     *
     * @param id 主键id
     * @return T 实体
     */
    T getById(ID id);

    /**
     * 获取所有实体
     *
     * @return
     */
    List<T> getAll();

    /**
     * 获取所有实体
     *
     * @param sort 排序规则
     * @return
     */
    List<T> getAll(Sort sort);

    /**
     * 根据主键列表获取实体
     *
     * @param ids 主键列表
     * @return
     */
    List<T> getAllById(Iterable<ID> ids);

    /**
     * 分页查询
     *
     * @param pageable 分页参数
     * @return
     */
    Page<T> getAll(Pageable pageable);

    /**
     * 分页查询
     *
     * @param pageable 分页参数
     * @param sort     排序规则
     * @return
     */
    Page<T> getAll(Pageable pageable, Sort sort);
}